<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Generator生成器.html</title>
</head>
<body>
<script type="text/javascript">

    //定义一个生成器函数
    function* a(){
        //第一次next()后函数会执行到这里并挂起
        yield 2;//这里的2会在调用遍历器的时候作为value值返回{value:2,done:false}
    }
    const fn = a();
    console.log(fn.next());//{value:2,done:false}
    //给生成器函数内部赋值
    function* b(){
        let x = yield 3;//注意这里的x并不是yield2的返回值，也不是第一次调用next(10)传入的值，而是第二次调用next()传入的值
        return x;//这里的return的值会作为最后一次调用next()返回，就是done属性值为true的时候{value: 20, done: true}
    }
    const fnb = b();
    console.log(fnb.next(10));
    console.log(fnb.next(20));
    //使用场景给对象添加一个iterator接口对象实现遍历===========================================================================
    let obj = {
        name:'a',
        age:18
    }
    function* objEntries(obj){
        const propKeys = Object.keys(obj);//这里获取到keys数组
        console.log(propKeys);
        // for (let i = 0; i < propKeys.length; i++) {
        //     yield [propKeys[i],obj[propKeys[i]]];
        // }
        //数组是具备迭代器的，所以可以直接使用for...of的方式去遍历
        for (const propKey of propKeys) {
            yield [propKey,obj[propKey]];
        }
    }
    obj[Symbol.iterator] = objEntries;
    const it = obj[Symbol.iterator](obj);
    for (const [key,value] of it) {
        console.log(`${key}:${value}`);
    }

</script>
</body>
</html>